home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / media / videobuf-dma-sg.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  3.8 KB  |  120 lines

  1. /*
  2.  * helper functions for SG DMA video4linux capture buffers
  3.  *
  4.  * The functions expect the hardware being able to scatter gather
  5.  * (i.e. the buffers are not linear in physical memory, but fragmented
  6.  * into PAGE_SIZE chunks).  They also assume the driver does not need
  7.  * to touch the video data.
  8.  *
  9.  * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
  10.  *
  11.  * Highly based on video-buf written originally by:
  12.  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
  13.  * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
  14.  * (c) 2006 Ted Walther and John Sokol
  15.  *
  16.  * This program is free software; you can redistribute it and/or modify
  17.  * it under the terms of the GNU General Public License as published by
  18.  * the Free Software Foundation; either version 2
  19.  */
  20.  
  21. #include <media/videobuf-core.h>
  22.  
  23. /* --------------------------------------------------------------------- */
  24.  
  25. /*
  26.  * Return a scatterlist for some page-aligned vmalloc()'ed memory
  27.  * block (NULL on errors).  Memory for the scatterlist is allocated
  28.  * using kmalloc.  The caller must free the memory.
  29.  */
  30. struct scatterlist* videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages);
  31.  
  32. /*
  33.  * Return a scatterlist for a an array of userpages (NULL on errors).
  34.  * Memory for the scatterlist is allocated using kmalloc.  The caller
  35.  * must free the memory.
  36.  */
  37. struct scatterlist* videobuf_pages_to_sg(struct page **pages, int nr_pages,
  38.                      int offset);
  39.  
  40. /* --------------------------------------------------------------------- */
  41.  
  42. /*
  43.  * A small set of helper functions to manage buffers (both userland
  44.  * and kernel) for DMA.
  45.  *
  46.  * videobuf_dma_init_*()
  47.  *    creates a buffer.  The userland version takes a userspace
  48.  *    pointer + length.  The kernel version just wants the size and
  49.  *    does memory allocation too using vmalloc_32().
  50.  *
  51.  * videobuf_dma_*()
  52.  *    see Documentation/PCI/PCI-DMA-mapping.txt, these functions to
  53.  *    basically the same.  The map function does also build a
  54.  *    scatterlist for the buffer (and unmap frees it ...)
  55.  *
  56.  * videobuf_dma_free()
  57.  *    no comment ...
  58.  *
  59.  */
  60.  
  61. struct videobuf_dmabuf {
  62.     u32                 magic;
  63.  
  64.     /* for userland buffer */
  65.     int                 offset;
  66.     struct page         **pages;
  67.  
  68.     /* for kernel buffers */
  69.     void                *vmalloc;
  70.  
  71.     /* for overlay buffers (pci-pci dma) */
  72.     dma_addr_t          bus_addr;
  73.  
  74.     /* common */
  75.     struct scatterlist  *sglist;
  76.     int                 sglen;
  77.     int                 nr_pages;
  78.     int                 direction;
  79. };
  80.  
  81. struct videobuf_dma_sg_memory
  82. {
  83.     u32                 magic;
  84.  
  85.     /* for mmap'ed buffers */
  86.     struct videobuf_dmabuf  dma;
  87. };
  88.  
  89. void videobuf_dma_init(struct videobuf_dmabuf *dma);
  90. int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
  91.                unsigned long data, unsigned long size);
  92. int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
  93.                  int nr_pages);
  94. int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction,
  95.                   dma_addr_t addr, int nr_pages);
  96. int videobuf_dma_free(struct videobuf_dmabuf *dma);
  97.  
  98. int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
  99. int videobuf_dma_sync(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
  100. int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
  101. struct videobuf_dmabuf *videobuf_to_dma (struct videobuf_buffer *buf);
  102.  
  103. void *videobuf_sg_alloc(size_t size);
  104.  
  105. void videobuf_queue_sg_init(struct videobuf_queue* q,
  106.              struct videobuf_queue_ops *ops,
  107.              struct device *dev,
  108.              spinlock_t *irqlock,
  109.              enum v4l2_buf_type type,
  110.              enum v4l2_field field,
  111.              unsigned int msize,
  112.              void *priv);
  113.  
  114.     /*FIXME: these variants are used only on *-alsa code, where videobuf is
  115.      * used without queue
  116.      */
  117. int videobuf_sg_dma_map(struct device *dev, struct videobuf_dmabuf *dma);
  118. int videobuf_sg_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma);
  119.  
  120.